home *** CD-ROM | disk | FTP | other *** search
/ Meeting Pearls 1 / Meeting Pearls Vol 1 (1994).iso / amok98-106 / amok98 / programminginoberon / in.mod < prev    next >
Text File  |  1993-10-07  |  3KB  |  91 lines

  1. MODULE In;    
  2. (* Stream-oriented input from a text, page 88, 98, 308 *)
  3. IMPORT Texts, Viewers, Oberon, TextFrames;
  4.  
  5. VAR
  6.     T: Texts.Text;  S: Texts.Scanner;  W: Texts.Writer;
  7.     beg: LONGINT;
  8.     Done*: BOOLEAN;
  9.  
  10. PROCEDURE Put(txt: ARRAY OF CHAR);  (* write txt to the System.Log viewer *)
  11. BEGIN
  12.     Texts.WriteString(W, txt);  Texts.WriteLn(W);  Texts.Append(Oberon.Log, W.buf)
  13. END Put;
  14.  
  15. PROCEDURE Open*;
  16. VAR  
  17.     end, time: LONGINT;
  18.     V: Viewers.Viewer;
  19. BEGIN
  20.     Texts.OpenScanner(S, Oberon.Par.text, Oberon.Par.pos);  Texts.Scan(S);
  21.     IF (S.class = Texts.Char) & (S.c = "^") THEN
  22.         (* start input stream at beginning of selection *)
  23.         Oberon.GetSelection(T, beg, end, time);
  24.         IF time >= 0 THEN  Texts.OpenScanner(S, T, beg);  Done := ~S.eot;
  25.         ELSE  Put("No selection"); Done := FALSE
  26.         END
  27.     ELSIF (S.class = Texts.Char) & (S.c = "*") THEN
  28.         (* start input stream at beginning of text in marked viewer *)
  29.         V := Oberon.MarkedViewer();
  30.         IF ~Oberon.Pointer.on THEN Put("Pointer not visible");  Done := FALSE
  31.         ELSIF (V.dsc # NIL) & (V.dsc.next IS TextFrames.Frame) THEN
  32.             T := V.dsc.next(TextFrames.Frame).text;  beg := 0;  
  33.             Texts.OpenScanner(S, T, beg);  Done := ~S.eot;
  34.         ELSE  Put("Marked viewer not a text viewer");  Done := FALSE
  35.         END
  36.     ELSE
  37.         (* start input stream after command name *)
  38.         T := Oberon.Par.text;  beg := Oberon.Par.pos;  
  39.         Texts.OpenScanner(S, T, beg);  Done := ~S.eot;
  40.     END
  41. END Open;
  42.  
  43. PROCEDURE Char*(VAR ch: CHAR);
  44. BEGIN
  45.     IF Done THEN  ch := S.nextCh;  Done := ~S.eot;  Texts.Read(S, S.nextCh)  END
  46. END Char;
  47.  
  48. PROCEDURE Int*(VAR i: INTEGER);
  49. BEGIN
  50.     IF Done THEN  Texts.Scan(S);  i := SHORT(S.i);  Done := (S.class = Texts.Int)  END
  51. END Int;
  52.  
  53. PROCEDURE LongInt*(VAR i: LONGINT);
  54. BEGIN
  55.     IF Done THEN  Texts.Scan(S);  i := S.i;  Done := (S.class = Texts.Int)  END
  56. END LongInt;
  57.  
  58. PROCEDURE Real*(VAR x: REAL);
  59. BEGIN
  60.     IF Done THEN  Texts.Scan(S);  x := S.x;  Done := (S.class = Texts.Real)  END
  61. END Real;
  62.  
  63. PROCEDURE LongReal*(VAR y: LONGREAL);
  64. BEGIN
  65.     IF Done THEN  Texts.Scan(S);  y := S.y;  Done := (S.class = Texts.LongReal)  END
  66. END LongReal;
  67.  
  68. PROCEDURE Name*(VAR nme: ARRAY OF CHAR);
  69. BEGIN
  70.     IF Done THEN  Texts.Scan(S);  COPY(S.s, nme);  Done := (S.class = Texts.Name)  END
  71. END Name;
  72.  
  73. PROCEDURE String*(VAR str: ARRAY OF CHAR);
  74. CONST CR = 0DX;  NUL = 0X;
  75. VAR ch: CHAR;  j: LONGINT;
  76. BEGIN
  77.     IF Done THEN
  78.         REPEAT  Char(ch)  UNTIL ((ch # " ") & (ch # CR)) OR ~Done;
  79.         j := 0;
  80.         WHILE Done & (ch # " ") & (ch # CR) DO  
  81.             IF j < LEN(str) - 1 THEN str[j] := ch;  INC(j)  END;
  82.             Char(ch)
  83.         END;
  84.         str[j] := NUL; Done := j # 0
  85.     END
  86. END String;
  87.  
  88. BEGIN  Texts.OpenWriter(W);  Done := FALSE
  89. END In.    (* Copyright M. Reiser, 1992 *)
  90.  
  91.